package cn.wolfcode.luowowo.redis.service.impl;

import cn.wolfcode.luowowo.redis.service.ISecurityRedisService;
import cn.wolfcode.luowowo.redis.util.RedisKeys;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.management.loading.PrivateClassLoader;
import java.util.concurrent.TimeUnit;

/**
 * 安全防护
 */
@Service
public class SecurityRedisServiceImpl implements ISecurityRedisService {

    @Autowired
    private StringRedisTemplate template;

    //判断key是否存在
    @Override
    public boolean isAllowBrush(String key) {
        //方式一：
        //如果存在，访问次数 - 1，做减之前判断结果是否小于 0，小于0，说明已经访问次数达到上限了
        //如果不存在，设置访问此时为10，然后次数 - 1

        //方式二：
        //如果存在， 不做任何操作，如果没有添加
        //等价于： setnx命令
        template.opsForValue().setIfAbsent(key, "10", RedisKeys.BRUSH_PROOF.getTime(), TimeUnit.SECONDS);//不存在才会执行set
        Long decrement = template.opsForValue().decrement(key);//设置了之后做 -1 的操作
        //一分钟最多10次，一分钟以后失效，失效期内，小于10次都是可以访问的
        return decrement >= 0;
    }
}
